Python爬虫 | 爬取虎牙直播星秀区1000多位漂亮小姐姐照片并做颜值评分
大家好,今天我们看看虎牙直播都有哪些好看的小姐姐吧!
我们打开虎牙直播选择娱乐天地的星秀模块,然后抓取下载正在直播的全部主播房间封面图,再用face++的颜值评分api看看好看的小姐姐都有哪些~
1.页面分析
打开虎牙直播星秀模块,按F12进入开发者模式,然后选中Network->XHR,再拖到页面最下方点击第2页,查看开发者页签中Name的变化找到如图所示部分即可。
虎牙直播这个翻页比较简单,直接通过原始url地址加上请求参数即可,如下:
# 原始url地址
url = 'https://www.huya.com/cache.php'
# 请求参数
parames = {
'm': 'LiveList',
'do': 'getLiveListByPage',
'gameId': 1663,
'tagAll': 0,
'page': 2, # 翻页后会变化的字段
}
我们点击开发者模式页签里的Preview可以看到请求的结果也是很格式化的,如下:
再对照左侧的实际网页渲染的结果,我们可以看到包含封面图(对应请求结果的screenshot),房间的简介(对应请求结果的 introduction),主播名称(对应请求结果的nick)以及其他一些更详细的信息。
2.单页主播信息爬取
对于请求的数据是非常标准的格式,我们直接用**json.loads()**方法即可解析为字典格式,然后选取需要的键值信息即可。
通过分析请求的结果数据,我们发现需要的单页主播信息在data = js['data']['datas']
中,是由字典组成的列表。同时,我们也可以发现此时在进行直播的主播数为1102,总页数为totalPage,这为我们后续做自动翻页提供了便利。
import requests
import json
import pandas as pd
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
}
# 原始Url地址
url = 'https://www.huya.com/cache.php'
# 请求参数
parames = {
'm': 'LiveList',
'do': 'getLiveListByPage',
'gameId': 1663,
'tagAll': 0,
'page': 1,
}
rep = requests.post(url,headers=headers,params=parames)
text = rep.text
# 请求结果为json格式,我们用json.loads()方法处理
js = json.loads(text)
# 通过字典获取键值
data = js['data']['datas']
# 直接转化为dataframe类型
df = pd.DataFrame(data)
转化为dataframe后结果预览,非常标准,如下:
3.主播图片下载
我们获取了主播房间的封面图(对应请求结果的screenshot)url地址,直接请求改地址然后就可进行保存本地了。
这里可以先将df中的该列数据转化为列表,然后遍历列表进行请求和下载到本地。
# 主播图片地址列表
urls = df.screenshot.to_list()
# 主播名称列表
nicks = df.nick.to_list()
for i,(nick,imgUrl) in enumerate(zip(nicks,urls)):
img = requests.get(imgUrl).content
name = f'封面图\{nick}.jpg'
with open(name,'wb') as f:
f.write(img)
print(f'{i+1}个图片已下载')
下载完成的主播封面图:
4.主播颜值评分
颜值评分这块我这里调用的是FACE++的人脸识别功能,使用前需要注册账号,然后申请一个应用即可。
创建应用获取你的key和你的secret,替换代码中相关部分。
# 定义获取评分的函数
def ksfaceScore(pic_url):
'''
Parameters
----------
pic_url : str
用于进行颜值评分的图片地址
Returns
-------
gender:str
性别
age:int
年龄
beauty_w:int
女性视角评分
beauty_m:int
男性视角评分
'''
url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
APIKey = '你的key'
APISecret = '你的secret'
# pic_url = 'https://anchorpost.msstatic.com/cdnimage/anchorpost/1071/be/43a2756f5fc3aa0df31a1bc14fb13a_1663_1610179385.jpg'
data = {"api_key":APIKey,
"api_secret":APISecret,
"image_url":pic_url,
"return_attributes":"gender,age,beauty"
}
res = requests.post(url,data = data)
dic_ = eval(res.text)
gender = dic_['faces'][0]['attributes']['gender']['value']
age = dic_['faces'][0]['attributes']['age']['value']
beauty_w = dic_['faces'][0]['attributes']['beauty']['female_score']
beauty_m = dic_['faces'][0]['attributes']['beauty']['male_score']
return gender,age,beauty_w,beauty_m
拿下面这个小姐姐图片做示例,其照片url地址为 https://anchorpost.msstatic.com/cdnimage/anchorpost/1071/be/43a2756f5fc3aa0df31a1bc14fb13a_1663_1610179385.jpg
。
我们调用函数获取相关参数数值如下:
In [1]: pic_url = 'https://anchorpost.msstatic.com/cdnimage/anchorpost/1071/be/43a2756f5fc3aa0df31a1bc14fb13a_1663_1610179385.jpg'
In [2]: ksfaceScore(pic_url)
Out[2]: ('Female', 22, 86.18, 85.295)
性别:Female(女)
年龄:22
女性视角评分:86.18
男性视角评分:85.295
5.完整代码(全部爬取、下载及评分)
以上部分建议大家在进行实操之后可进行功能模块的函数化,定义每个功能的实现函数,这样就比较优雅,我这里附上不太优雅的全部代码啦。
看下颜值最高的:
性别:Female(女)
年龄:22
女性视角评分:93.498
男性视角评分:92.441
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 14 12:47:38 2021
@author: 可以叫我才哥
"""
import requests
import json
import pandas as pd
import time
url = 'https://www.huya.com/cache.php'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
}
dfs = []
# 这里的page总数你可以自动获取其实~
for page in range(1,16):
parames = {
'm': 'LiveList',
'do': 'getLiveListByPage',
'gameId': 1663,
'tagAll': 0,
'page': page,
}
rep = requests.post(url,headers=headers,params=parames)
text = rep.text
js = json.loads(text)
data = js['data']['datas']
df = pd.DataFrame(data)
dfs.append(df)
result = pd.concat(dfs)
# 下载照片到本地
urls = result.screenshot.to_list()
nicks = result.nick.to_list()
for i,(nick,imgUrl) in enumerate(zip(nicks,urls)):
img = requests.get(imgUrl).content
name = f'封面图\{nick}.jpg'
with open(name,'wb') as f:
f.write(img)
print(f'{i+1}个图片已下载')
# 颜值评分函数
def ksfaceScore(pic_url):
'''
Parameters
----------
pic_url : str
用于进行颜值评分的图片地址
Returns
-------
gender:str
性别
age:int
年龄
beauty_w:int
女性视角评分
beauty_m:int
男性视角评分
'''
url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
APIKey = '你的key'
APISecret = '你的secret'
# pic_url = 'http://img5.iqiyipic.com/image/paopao/paopao_5e71ef4a4e5042268db59ac4_default.jpg?'
data = {"api_key":APIKey,
"api_secret":APISecret,
"image_url":pic_url,
"return_attributes":"gender,age,beauty"
}
res = requests.post(url,data = data)
dic_ = eval(res.text)
try:
gender = dic_['faces'][0]['attributes']['gender']['value']
age = dic_['faces'][0]['attributes']['age']['value']
beauty_w = dic_['faces'][0]['attributes']['beauty']['female_score']
beauty_m = dic_['faces'][0]['attributes']['beauty']['male_score']
except :
gender = age = beauty_w = beauty_m = -1
return gender,age,beauty_w,beauty_m
# 整合颜值评分
lis = []
for i,pic_url in enumerate(urls):
time.sleep(0.5)
gender,age,beauty_w,beauty_m = ksfaceScore(pic_url)
lis.append([gender,age,beauty_w,beauty_m])
print(f'{i+1}个颜值已处理')
score = pd.DataFrame(lis,columns=['性别','年龄','女性视角评分','男性视角评分'])
# 中文变量名
结果 = df.merge(score,left_index=True,right_index=True)
- END -